No Mission

Japan as Walang hiya

【Linux】クリップボードについて【X Window System】

PCを使う上で、コピペ、いわゆるクリップボード機能は無くてはならないものです。
これがあるからこそ、異なるアプリケーション間で簡単にデータ共有できます。
このクリップボード機能、別にWindowsの専売特許というわけではなくて、様々なOSで利用できますが、昔々のMS-DOS時代にはクリップボード機能など存在せず、同じアプリケーション内か特定アプリケーション同士でしかコピー出来ませんでした。

 Linuxクリップボード

さて、私は普段プライベートではLinuxUbuntu)を使っています。
Linux環境でも、当然クリップボード機能があるのですが、実はWindowsと異なりコピペの方式が2通りあります。

一つは、Windowsと同じくアプリケーションのメニューから「コピー」または「Ctrl-c」でコピーし、メニューから「貼り付け」あるいは「Ctrl-v」でペーストする方式です。
Linuxをデスクトップ用途で使ってる人(あまりいないかと思いますが)は、特段思うところもなく、普通に使ってると思います。

で、もう一つ。こちらはマウス操作などでテキストを選択すると、その選択範囲が自動でコピーされるものです。ペーストは、3つボタンマウスであれば中クリック。2ボタンマウスであれば、左・右同時押しクリックです。
この使い方は、古くからLinux/UNIXを使ってる人でなければ、あまり知らないかもしれません。

なお、上記二つのクリップボード機能は、正確にはLinuxというよりはX Window Systemの方の機能です。
また、本当はクリップボードじゃなくてXセレクションといいます。

Xセレクション 3つの領域

上記、2通りのコピーですが、前者のWindowsと同じタイプのコピー(面倒なので、以後Windowsタイプと言います。)と、後者の選択範囲タイプのコピー(以後、選択範囲タイプと呼びます。)は、メモリ上、別領域に格納されます。
そのため、Windowsタイプのコピーが選択範囲タイプのコピーで上書きされたりすることはありません。
それぞれのコピーで使用される領域は、Windowsタイプが「CLIPBOARD」、選択範囲タイプが「PRIMARY」と呼ばれています。
(というか、それぞれ、そういう名前で定義されてるバッファに格納するよう定められてるのですが、このへんの表現の仕方は、あまり気にしなくてよいです。)

なお、CLIPBOARDだのPRIMARYだのといった名称は、X Window Systemのクライアント間相互運用に関する標準規格を定めたICCCM*1により定義されているものです。
ちなみに、CLIPBOARD、PRIMARYの他に「SECONDARY」という領域もあるのですが、こちらはほとんど使われていません。

Vimレジスタとの関係

そういえば、Vimを使ってる方なんかは、クリップボード連携のレジスタで混乱した方もいるかもしれません。
ネットの説明とかものの本では、さらりと「"*y」または「"+y」でクリップボードにコピー、「"*p」か「"+p」でクリップボードからペーストとか書かれてることが多く、「実際に試したら"+の方しかクリップボード連携できない、どうなってんだ」となりがちです。
実は、「"*」はPRIMARY領域、「"+」はCLIPBOARD領域を対象としています。そのため、Windowsタイプのクリップボード連携がしたい場合は「"+」を使用することになるわけです。
ちなみに、ビジュアルモードでコピー(yank)した場合、"*レジスタ、すなわちXセレクションのPRIMARY領域にも格納されます。

シェルからXセレクションを操作する

ちなみに、Linuxではシェル上でXセレクションを操作するコマンドがいくつかあります。
xclipとか、xselとか…。

ここでは例としてxclipを挙げます。環境はUbuntuです。
CentOSではxselのほうが良いという話も聞きますが、私は確認しておりませんので、必要な方はご自身で調べてみてください。)

xclipのインストール

以下でインストールできます。

sudo apt-get install xclip
xclipの使い方

xclipコマンドは、標準入力/標準出力とXセレクションの媒介を行うものです。
主なオプションは以下

-i 標準入力からXセレクションへコピーを行う
-o Xセレクションの内容を標準出力へ出力
-selection セレクションの内容を標準出力へ出力
Xセレクションのどの領域を使うか指定する。指定なし時はPRIMARYとなる。例えば「-selection clipboard」とするとCLIPBOARD領域が使用される。

例:

CLIPBOARD領域にコピー:
echo hoge | xclip -i -selection clipboard CLIPBOARD領域から画面に出力:
xclip -o -selection clipboard PRIMARY領域からファイルに出力:
xclip -o > primary.txt

なお、-selectionは省略して「-sel」でも利用できます。
primary、secondary、clipboard指定も、それぞれ「p」、「s」、「c」指定でOKです。

 

 

 

*1:Inter-Client Communication Conventions Manualの略。